package com.example.netttytest.mychat;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MyChatServerHandler extends SimpleChannelInboundHandler<String> {

    //GlobalEventExecutor.INSTANCE是全局的事件执行器，是单例
    private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

    /**
     * 表示channeli表示就绪状态 ，提示上线
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        Channel channel = ctx.channel();
        //将该客户加入聊天的信息推送给其他在线的客户端
        //该方法会将 channelGroup所有的channel遍历，并发送消息
        channelGroup.writeAndFlush("[ 客户端 ]" + channel.remoteAddress() + " 上线了 ！时间：" + sdf.format(new Date()) + "\n");
        //将当前的channel加入 channelGroup 中
        channelGroup.add(channel);
        System.out.println(channel.remoteAddress() + " 上线了~~" + "\n");
    }

    /**
     * 表示channel 处于不活动状态 提示下线
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        Channel channel = ctx.channel();
        channelGroup.writeAndFlush("[ 客户端 ]" + channel.remoteAddress() + " 下线 了 ！时间：" + sdf.format(new Date()) + " \n");
        System.out.println(channel.remoteAddress() + " 下线了~~" + "\n");
        System.out.println("当前人数 ----> channelGroup size = " + channelGroup.size() + "\n");
    }


    /**
     * 读取数据
     *
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        //获取当前 channel
        Channel channel = ctx.channel();
        //遍历  channelGroup 根据不同的情况 回复不同消息
        channelGroup.forEach(n -> {
            if (channel != n) {
                if (msg.split("：")[0].equalsIgnoreCase("群发")) {  // 1 群发
                    n.writeAndFlush("[ 客户端 ]" + channel.remoteAddress() + " 发送了：" + msg + " \n");
                } else {     // 发送给 其他人
                    String tarAddress = msg.split(",")[0];//传来的地址
                    //这里要用remoteAddress(上线时候的address)如果用localAddress，就是你在127.0.0.1：9002(9002)是你在server和client端声明的
                    String curAddress = n.remoteAddress().toString().split(":")[1];   // 当前线程的地址
                    if (curAddress.equalsIgnoreCase(tarAddress)) {
                        n.writeAndFlush("[ 客户端 ]" + channel.remoteAddress() + " 发送了：" + msg + " \n");
                    }
                }
            } else if (channel == n) {  // 自己
                System.out.println("[ 自己向 ]" + channel.remoteAddress() + " 发送了：" + msg + " \n");
                n.writeAndFlush("[ 自己向 ]" + channel.remoteAddress() + " 发送了：" + msg + " \n");
            }

//            if (channel != n) {     //不是当前的channel
//                n.writeAndFlush("[ 客户端 ]" + channel.remoteAddress() + " 发送了：" + msg + " \n");
//            } else if(channel==n) {            //回显自己发送给自己的消息
//                n.writeAndFlush("[ 自己 ]" + channel.remoteAddress() + " 发送了：" + msg + " \n");
//            }
        });
    }

    /**
     * 处理异常, 一般是需要关闭通道
     *
     * @param ctx
     * @param evt
     * @throws Exception
     */
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        ctx.close();
    }
}
